#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *给定一个数字，我们按照如下规则把它翻译为字符串：0 翻译成 “a” ，1 翻译成 “b”，……，11 翻译成 “l”，……，25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数，用来计算一个数字有多少种不同的翻译方法。

 

示例 1:

输入: 12258     //1 2 5 1 8
输出: 5
解释: 12258有5种不同的翻译，分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
1 .  1 (1)
2 .  2 (1 2) (12)
3 .  3 (1 2 2) (12 2)  (1 22)
4    4  (1 2 2 5) (12 2 5) (1 22 5) (1 2 25) (12 25)
5    5  (1 2 2 5 8) (12 2 5 8) (1 22 5 8) (1 2 25 8) (12 25 8)
 //如果新加的数和前一个数比较能组成小于26的数则 dp[i]=dp[i-1]+dp[i-2]; 否则等于dp[i-1]

 * */
//dp[i] 表示到当前下标能组成的结果
//数和前一个数比较能组成小于26的数则 dp[i]=dp[i-1]+dp[i-2]; 否则等于dp[i-1]
//初始化不用初始化dp[0]=1;
//循环 从1开始
int translateNum(int num) {
    if (num < 10)
        return 1;
    string nums = to_string(num);
    vector<int> dp(nums.size(), 0);


    dp[0] = 1;
    int temp = (nums[0] - '0') * 10 + (nums[1] - '0');
    if (temp < 26)
        dp[1] = 2;
    else
        dp[1] = 1;//注意这个有时候是1 有时候是2

    if (nums.size() == 2 && num >= 26)
        dp[1] = 1;

    for (int i = 2; i < nums.size(); ++i) {
        int temp = (nums[i - 1] - '0') * 10 + (nums[i] - '0');
        //排除 06 这种情况当成 6 了其实只有一种
        if (temp <= 25 && (nums[i - 1] - '0') != 0) {
            dp[i] = dp[i - 1] + dp[i - 2];
        } else {
            dp[i] = dp[i - 1];
        }
    }


    return dp[nums.size() - 1];
}

int translateNumDg(int num) {


}